<?php
/**
 * Enregistrement (Row) de base de données
 *
 * @package zfbook
 * @subpackage db
 */
class Zfbook_Db_Table_Row extends Zend_Db_Table_Row_Abstract
{
    /**
     * Activation / Désactivation de l'autosauvegarde à la destruction
     * 
     * @var boolean 
     */
    private static $_autoSave = true;

    /**
     * Méthode de manipulation de l'autosauvegarde
     * 
     * @param boolean $save
     * @return void
     */
    public static function setAutoSave($save)
    {
        self::$_autoSave = (bool) $save;
    }

    /**
     * Sauvegarde les données dans le cache
     * 
     * @return boolean
     */
    public function saveToMemory()
    {
        $cache = Zend_Db_Table::getDefaultMetadataCache();
        if (!$cache instanceof Zend_Cache_Core) {
            throw new Zend_Db_Table_Row_Exception('Pas de cache configuré');
        }
        $cacheId = '';
        foreach ($this->_primary as $primary) {
            $cacheId .= '_' . $this->$primary;
        }
        return $cache->save($this, $this->_tableClass . $cacheId);
    }

    /**
     * Sauvegarde automatiquement l'objet dans le cache si la sauvegarde est activée
     */
    public function __destruct()
    {
        if (!self::$_autoSave || empty($this->_modifiedFields)) {
            return;
        }
        $this->saveToMemory();
    }

    /**
     * Reconnecte automatiquement l'objet à sa table
     * 
     * Appelé à la désérialisation de l'objet.
     */
    public function __wakeup()
    {
        $this->setTable(new $this->_tableClass);
    }
}
